#ifndef THREAD_SYNC_H
#define THREAD_SYNC_H

#include <pthread.h>
#include <semaphore.h>

// 共享资源
extern int counter;

// 锁的定义
extern pthread_mutex_t mutex_lock;      // 互斥锁
extern pthread_rwlock_t rw_lock;        // 读写锁
extern pthread_spinlock_t spin_lock;    // 自旋锁
extern pthread_cond_t cond_var;         // 条件变量
extern pthread_mutex_t cond_mutex;      // 条件变量的互斥锁
extern sem_t semaphore;                 // 信号量

// 条件变量标志
extern int condition_met;

// 初始化所有锁
void init_locks();

// 销毁所有锁
void destroy_locks();

// 互斥锁线程函数
void *mutex_thread(void *arg);

// 读写锁线程（读）函数
void *rwlock_thread_read(void *arg);

// 读写锁线程（写）函数
void *rwlock_thread_write(void *arg);

// 自旋锁线程函数
void *spinlock_thread(void *arg);

// 条件变量线程函数
void *cond_var_thread(void *arg);

// 信号量线程函数
void *semaphore_thread(void *arg);

// 信号条件发送线程
void *signal_condition_thread(void *arg);

// 执行所有锁验证
int locks_verify();

#endif // THREAD_SYNC_H

/*
互斥锁线程 (mutex_thread)：控制多个线程对共享变量 counter 的访问。只有一个线程可以持有互斥锁，因此保证了 counter 操作的原子性。

读写锁线程 (rwlock_thread_read 和 rwlock_thread_write)：读写锁允许多个线程同时读取 counter，但在写入时只有一个线程可以持有锁。在 rwlock_thread_read 中读取 counter 的值，而在 rwlock_thread_write 中进行写操作。

自旋锁线程 (spinlock_thread)：适合短时间锁定的场景。自旋锁在等待锁时会忙等而不阻塞，因此适合轻量级任务。本例中，自旋锁控制 counter 增加 3。

条件变量线程 (cond_var_thread)：等待条件满足后才执行。条件变量线程会等待 signal_condition_thread 发送条件满足的信号。signal_condition_thread 在线程启动 1 秒后设置条件并通知等待的条件变量线程。

信号量线程 (semaphore_thread)：控制多个线程对共享资源的顺序访问。信号量设为 1，多个线程可以依次访问 counter，保证只有一个线程在 counter 上执行增量操作。 
*/
